package com.shxzz.shortlink.project.service.impl;

import cn.hutool.core.bean.BeanUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.shxzz.shortlink.project.dao.entity.LinkDO;
import com.shxzz.shortlink.project.dao.mapper.LinkMapper;
import com.shxzz.shortlink.project.dto.req.RecycleBinPageReqDTO;
import com.shxzz.shortlink.project.dto.req.RecycleBinRemoveReqDTO;
import com.shxzz.shortlink.project.dto.req.RecycleBinRestoreReqDTO;
import com.shxzz.shortlink.project.dto.req.RecycleBinSaveReqDTO;
import com.shxzz.shortlink.project.dto.resp.RecycleBinLinkPageRespDTO;
import com.shxzz.shortlink.project.service.RecycleBinService;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;

/**
 * @author shxzz
 * @create 2023-12-25-18:54
 * @description 回收站管理接口实现类
 */
@Service
@RequiredArgsConstructor
public class RecycleBinServiceImpl extends ServiceImpl<LinkMapper, LinkDO> implements RecycleBinService {

    private final LinkMapper linkMapper;

    @Override
    public void moveToRecycleBin(RecycleBinSaveReqDTO requireParam) {
        LambdaUpdateWrapper<LinkDO> updateWrapper = Wrappers.lambdaUpdate(LinkDO.class)
                .eq(LinkDO::getFullShortUrl, requireParam.getFullShortUrl())
                .eq(LinkDO::getGid, requireParam.getGid())
                .eq(LinkDO::getEnableStatus, 0)
                .eq(LinkDO::getDelFlag, 0)
                .set(LinkDO::getEnableStatus, 1);
        LinkDO linkDO = LinkDO.builder().build();
        linkMapper.update(linkDO, updateWrapper);
    }

    @Override
    public IPage<RecycleBinLinkPageRespDTO> selectPageRecycleBin(RecycleBinPageReqDTO requireParam) {
        LambdaQueryWrapper<LinkDO> queryWrapper = Wrappers.lambdaQuery(LinkDO.class)
                .in(LinkDO::getGid, requireParam.getGidList())
                .eq(LinkDO::getEnableStatus, 1)
                .eq(LinkDO::getDelFlag, 0)
                .orderByDesc(LinkDO::getUpdateTime);

        IPage<LinkDO> recycleBinLinkPage = linkMapper.selectPage(requireParam, queryWrapper);
        return recycleBinLinkPage.convert((linkDO -> BeanUtil.toBean(linkDO, RecycleBinLinkPageRespDTO.class)));
    }

    @Override
    public void restoreRecycleBinLink(RecycleBinRestoreReqDTO requireParam) {
        LambdaUpdateWrapper<LinkDO> updateWrapper = Wrappers.lambdaUpdate(LinkDO.class)
                .eq(LinkDO::getFullShortUrl, requireParam.getFullShortUrl())
                .eq(LinkDO::getGid, requireParam.getGid())
                .eq(LinkDO::getEnableStatus, 1)
                .eq(LinkDO::getDelFlag, 0)
                .set(LinkDO::getEnableStatus, 0);
        LinkDO linkDO = LinkDO.builder().build();
        linkMapper.update(linkDO, updateWrapper);
    }

    @Override
    public void removeRecycleBinLink(RecycleBinRemoveReqDTO requireParam) {
        LambdaUpdateWrapper<LinkDO> updateWrapper = Wrappers.lambdaUpdate(LinkDO.class)
                .eq(LinkDO::getFullShortUrl, requireParam.getFullShortUrl())
                .eq(LinkDO::getGid, requireParam.getGid())
                .eq(LinkDO::getEnableStatus, 1)
                .eq(LinkDO::getDelFlag, 0)
                .set(LinkDO::getDelFlag, 1);
        LinkDO linkDO = LinkDO.builder().build();
        linkMapper.update(linkDO, updateWrapper);
    }


}
